package javachongkao.面向对象下.形状继承;

import java.util.Arrays;
import java.util.Scanner;

//7-7 jmu-Java-03面向对象基础-04-形状-继承
//前言
//前面题目形状中我们看到，为了输出所有形状的周长与面积，需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。
//
//本题描述
//1.定义抽象类Shape
//属性：不可变静态常量double PI，值为3.14，
//抽象方法:public double getPerimeter(),public double getArea()
//
//2.Rectangle与Circle类均继承自Shape类。
//Rectangle类(属性：int width,length)、Circle类(属性：int radius)。
//带参构造方法为Rectangle(int width,int length),Circle(int radius)。
//toString方法(Eclipse自动生成)
//
//3.编写double sumAllArea方法计算并返回传入的形状数组中所有对象的面积和与
//double sumAllPerimeter方法计算并返回传入的形状数组中所有对象的周长和。
//
//4.main方法
//4.1 输入整型值n，然后建立n个不同的形状。如果输入rect，则依次输入宽、长。如果输入cir，则输入半径。
//4.2 然后输出所有的形状的周长之和，面积之和。并将所有的形状信息以样例的格式输出。  提示：使用Arrays.toString。
//4.3  最后输出每个形状的类型与父类型.使用类似shape.getClass() //获得类型, shape.getClass().getSuperclass() //获得父类型;
//
//注意：处理输入的时候使用混合使用nextInt与nextLine需注意行尾回车换行问题。
//
//思考
//你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适？
//是否应该声明为static?
abstract class Shape {
    public static final double PI = 3.14;

    public abstract double getPerimeter();
    public abstract double getArea();
}

class Rectangle extends Shape {
    private int width;
    private int length;

    public Rectangle(int width, int length) {
        this.width = width;
        this.length = length;
    }

    @Override
    public double getPerimeter() {
        return 2 * (width + length);
    }

    @Override
    public double getArea() {
        return width * length;
    }

    @Override
    public String toString() {
        return "Rectangle [width=" + width + ", length=" + length + "]";
    }
}

class Circle extends Shape {
    private int radius;

    public Circle(int radius) {
        this.radius = radius;
    }

    @Override
    public double getPerimeter() {
        return 2 * PI * radius;
    }

    @Override
    public double getArea() {
        return PI * radius * radius;
    }

    @Override
    public String toString() {
        return "Circle [radius=" + radius + "]";
    }
}

public class Main {
    public static double sumAllArea(Shape[] shapes) {
        double sum = 0;
        for (Shape shape : shapes) {
            sum += shape.getArea();
        }
        return sum;
    }

    public static double sumAllPerimeter(Shape[] shapes) {
        double sum = 0;
        for (Shape shape : shapes) {
            sum += shape.getPerimeter();
        }
        return sum;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        Shape[] shapes = new Shape[n];

        for (int i = 0; i < n; i++) {
            String type = scanner.nextLine();
            if (type.equals("rect")) {
                int width = scanner.nextInt();
                int length = scanner.nextInt();
                scanner.nextLine(); // 消耗换行符
                shapes[i] = new Rectangle(width, length);
            } else if (type.equals("cir")) {
                int radius = scanner.nextInt();
                scanner.nextLine(); // 消耗换行符
                shapes[i] = new Circle(radius);
            }
        }

        // 输出周长和面积总和
        System.out.println(sumAllPerimeter(shapes));
        System.out.println(sumAllArea(shapes));

        // 输出所有形状信息
        System.out.println(Arrays.toString(shapes));

        // 输出每个形状的类型与父类型
        for (Shape shape : shapes) {
            System.out.println(shape.getClass() + "," + shape.getClass().getSuperclass());
        }

        scanner.close();
    }
}